package zb.blog.base.util;

import com.sun.mail.util.MailSSLSocketFactory;
import zb.blog.base.bean.Result;
import zb.blog.base.global.GlobalVar;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.GeneralSecurityException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

public class EmailUtil {
    /**
     * @param toUsers 发送给谁
     * @param text    发送内容
     * @param title   发送标题
     * @return true：发送成功，false：发送失败
     */
    public static boolean sendMail(String[] toUsers, String title, String text) throws GeneralSecurityException {
        Properties props = new Properties();
        props.setProperty("mail.smtp.host", GlobalVar.EMAIL_SMTP); // 设置发送邮件的邮件服务器的属性（这里使用qq的smtp服务器）
        props.put("mail.smtp.host", GlobalVar.EMAIL_SMTP); // 需要经过授权，也就是有户名和密码的校验，这样才能通过验证（一定要有这一条）
        props.put("mail.smtp.auth", "true");//需要验证身份
        props.setProperty("mail.transport.protocol", GlobalVar.EMAIL_SMTP_PROTOCOL);// 发送邮件协议名称


        // 开启SSL加密，否则会失败
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);


        // 用刚刚设置好的props对象构建一个session
        Session session = Session.getDefaultInstance(props);
        Transport transport = null;
        try {
            // 创建邮件对象
            MimeMessage message = new MimeMessage(session);
            // 指明邮件的发件人
            message.setFrom(new InternetAddress(GlobalVar.EMAIL_ADDR));
            // 指明邮件的收件人(这里群发，需要遍历收件人)
            for (String toUSer : toUsers) {
                message.addRecipient(Message.RecipientType.TO, new InternetAddress(toUSer));
            }
            //给邮件设置标题
            message.setSubject(title);
            // 向multipart对象中添加邮件的各个部分内容，包括文本内容和附件
            Multipart multipart = new MimeMultipart();
            // 设置邮件的文本内容
            BodyPart contentPart = new MimeBodyPart();
            //设置邮件内容
            contentPart.setContent(text, "text/html;charset=utf-8");
            multipart.addBodyPart(contentPart);
            message.setContent(multipart);
            // 保存邮件信息
            message.saveChanges();

            // 连接服务器的邮箱
            transport = session.getTransport(GlobalVar.EMAIL_SMTP_PROTOCOL);
            // 连接邮件服务器：邮箱类型，帐号，授权码代替密码（更安全）
            transport.connect(GlobalVar.EMAIL_SMTP, GlobalVar.EMAIL_USERNAME, GlobalVar.EMAIL_PASSWORD);
            //将邮件信息发出
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (MessagingException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }


    /**
     * 获取发送邮件的html字符串
     *
     * @param map 需要的参数
     *            type             -->type   1：评论 ，2：留言
     *            comm_time        -->comm_time   评论时间，留言时间
     *            reply_content    -->reply_content  博主回复内容
     *            visitor_content  -->visitor_content  访客的评论
     *            curArticleUrl    -->article_url  当前文章的url地址
     *            curArticleTitle  -->article_title 当前文章的标题
     *            audit_status     -->audit_status 审核状态
     * @return
     */
    public static Result getEmailHtml(Map<String, String> map) {
        Result res = new Result();
        String comm_type = map.get("type");
        String tips = "";//提示信息内容
        String comm_type_word = "";//评论 留言
        String reply_content = map.get("reply_content");//博主回复的内容
        String visitor_content = map.get("visitor_content");//访客评论的内容
        String comm_time = map.get("comm_time");//评论、留言时间
        String audit_status = map.get("audit_status");//通过  不通过
        if (comm_type == null || !(comm_type.equals("1") || comm_type.equals("2") || comm_type.equals("3"))) {
            res.setSuccess(GlobalVar.FAIL);
            res.setMsg("邮件发送时：type参数类型不对");
            return res;
        }
        if (reply_content == null || reply_content.trim().length() <= 0) {
            res.setSuccess(GlobalVar.FAIL);
            res.setMsg("邮件发送时：回复内容不能为空");
            return res;
        }
        if (visitor_content == null || visitor_content.trim().length() <= 0) {
            res.setMsg("邮件发送时：访客评论或留言内容不能为空");
            res.setSuccess(GlobalVar.FAIL);
            return res;
        }
        if (comm_time == null || comm_time.trim().length() <= 0) {
            res.setMsg("邮件发送时：时间不能为空");
            res.setSuccess(GlobalVar.FAIL);
            return res;
        }
        if (audit_status == null || audit_status.length() <= 0) {
            res.setMsg("邮件发送时：审核状态不能为空");
            res.setSuccess(GlobalVar.FAIL);
            return res;
        }
        if (comm_type.equals("3")) {//评论
            comm_type_word = "评论";
            String curArticleUrl = map.get("article_url");//当前评论的文章地址
            String curArticleTitle = map.get("article_title");//当前评论的文章标题
            tips = "您之所以收到这封邮件，是因为你在北京时间 " + comm_time + " 在" +
                    "        【<a href='" + GlobalVar.HOME_URL + "#index.html' title=\"点击进入1的N次幂的个人博客\">1的N次幂</a>】" +
                    "        的个人博客对" +
                    "        【<a href='" + curArticleUrl + "' title=\"" + curArticleTitle + "\">" + curArticleTitle + "</a>】" +
                    "        文章发表了" + comm_type_word + "，博主对您的" + comm_type_word + "进行了回复。";
        } else if (comm_type.equals("2")) {//留言
            comm_type_word = "留言";
            tips = "您之所以收到这封邮件，是因为你在北京时间 2018-5-9 15:24:50 在" +
                    "        【<a href='" + GlobalVar.HOME_URL + "#index.html' title=\"点击进入1的N次幂的个人博客\">1的N次幂</a>】" +
                    "        的个人博客发表了" + comm_type_word + "，博主对您的" + comm_type_word + "进行了回复。";
        } else if (comm_type.equals("1")) {//关于我（暂没有评论入口）

        }
        String emailHTML = "<!doctype html><html><head><title>1的N次幂回复通知</title><meta charset=\"utf-8\"/><style type=\"text/css\">.zb-panel,body,html{font-family:\"宋体\"}.zb-panel{border:2px solid #bce8f1;box-shadow:3px 3px 15px rgba(0,0,0,.5);border-radius:15px;transition:all .3s}.zb-panel:hover{transform:translateY(-2px);box-shadow:3px 3px 30px rgba(0,0,0,.6);border-radius:15px}.zb-panel header{font-size:20px;border-radius:15px 15px 0 0;color:#31708f;background-color:#d9edf7;border-color:#bce8f1;padding:10px 15px}.zb-panel .panel-body{padding:15px;font-size:14px;font-weight:600}.zb-panel p{margin:20px}.zb-panel a{color:#7b89ce}.zb-panel a:hover{color:#1081e6;font-weight:700}.zb-panel font{font-weight:600}.zb-panel footer{margin-top:30px}.panel-main{border-radius:10px;box-shadow:1px 1px 15px rgba(0,0,0,.1);margin:0 15px;padding:15px}.zb-panel .panel-main p,.zb-panel footer p{padding:5px}.zb-panel .panel-main:hover{box-shadow:1px 1px 30px rgba(0,0,0,.2)}.zb-panel .dd{font-weight:bold;margin:5px 0}.zb-panel .dt{padding:5px;padding-left:15px}.zb-panel .reply{margin-top:15px}.zb-panel .status{margin-top:20px;}</style></head><body><div class=\"zb-panel\"><header>1的N次幂 对您发表的" + comm_type_word + "进行了回复： </header><div class=\"panel-body\">提示：" + tips + "</div><div class=\"panel-main\"><div class=\"dd\">您的" + comm_type_word + "：</div><div class =\"leave_content dt\">" + visitor_content + "</div><div class=\"dd reply\">博主回复您：</div><div class=\"reply_content dt\">" + reply_content + "</div><div class=\"dd status\">审核是否通过：<span>" + audit_status + "</span></div></div><footer><p>感谢您对本网站的支持，欢迎继续对本网站其他文章做出评价！ 点击进入 <a href='" + GlobalVar.HOME_URL + "#index.html' title=\"点击进入1的N次幂的个人博客\">1的N次幂个人网站 </a>首页： <a href='" + GlobalVar.HOME_URL + "#index.html' title=\"点击进入1的N次幂的个人博客\">" + GlobalVar.HOME_URL + " </a></p></footer></div></body></html>";
        res.setSuccess(GlobalVar.SUCCESS);
        res.setData(emailHTML);
        return res;
    }


    public static void main(String[] args) throws GeneralSecurityException { // 做测试用
        //String toUser = "bin_zhang@ddtech.net.cn";
        String[] toUser = new String[]{"405848266@qq.com"};
        String title = "这是一封测试邮件！";
        EmailUtil emailUtil = new EmailUtil();
        Map<String, String> map = new HashMap<>();
        map.put("type", "1");
        map.put("comm_time", DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:SS").format(LocalDateTime.now()));
        map.put("reply_content", "感谢您对本文章的评论！");
        map.put("visitor_content", "文章不错哦!");
        map.put("article_url", "/frontstage/detail.html?id=48");
        map.put("article_title", "java8新特性");
        map.put("audit_status", "1");
        Result res = emailUtil.getEmailHtml(map);
        boolean isSendSuccess = false;
        if (res.getSuccess()) {
            isSendSuccess = emailUtil.sendMail(toUser, title, (String) res.getData());
        } else {
            System.out.println(res.getMsg());
        }
        if (isSendSuccess) {
            System.out.println("邮件发送成功！");
        } else {
            System.out.println("邮件发送失败！");
        }
    }

}
